﻿// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

#nullable disable

using System.Drawing;
using Windows.Win32.UI.Accessibility;

namespace System.Windows.Forms.Tests.AccessibleObjects;

public class DataGridViewColumnHeaderCellAccessibleObjectTests : DataGridViewColumnHeaderCell
{
    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_Ctor_Default()
    {
        DataGridViewColumnHeaderCellAccessibleObject accessibleObject = new(null);
        Assert.Null(accessibleObject.Owner);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_Parent_ThrowException_IfOwnerIsNull()
    {
        Assert.Throws<InvalidOperationException>(() => new DataGridViewColumnHeaderCellAccessibleObject(null).Parent);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_Parent_ReturnsExpected()
    {
        using DataGridView control = new();
        control.Columns.Add("Column 1", "Header text 1");
        DataGridViewColumnHeaderCell cell = control.Columns[0].HeaderCell;

        var accessibleObject = (DataGridViewColumnHeaderCellAccessibleObject)cell.AccessibilityObject;

        Assert.Equal(control.AccessibilityObject.GetChild(0), accessibleObject.Parent);
        Assert.False(control.IsHandleCreated);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_Role_ReturnsExpected()
    {
        DataGridViewColumnHeaderCellAccessibleObject accessibleObject = new(null);
        Assert.Equal(AccessibleRole.ColumnHeader, accessibleObject.Role);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_Name_ReturnsExpected()
    {
        string testHeaderName = "Test header name";
        using DataGridView control = new();
        control.Columns.Add("Column 1", testHeaderName);

        var accessibleObject = (DataGridViewColumnHeaderCellAccessibleObject)control.Columns[0].HeaderCell.AccessibilityObject;

        Assert.Equal(testHeaderName, accessibleObject.Name);
        Assert.False(control.IsHandleCreated);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_Value_ReturnsExpected()
    {
        string testHeaderName = "Test header name";
        using DataGridView control = new();
        control.Columns.Add("Column 1", testHeaderName);

        var accessibleObject = (DataGridViewColumnHeaderCellAccessibleObject)control.Columns[0].HeaderCell.AccessibilityObject;

        Assert.Equal(testHeaderName, accessibleObject.Value);
        Assert.False(control.IsHandleCreated);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_Bounds_IsNotEmptyRectangle_IfHandleIsCreated()
    {
        using DataGridView control = new();
        control.Columns.Add("Column 1", "Header text 1");
        control.CreateControl();

        var accessibleObject = (DataGridViewColumnHeaderCellAccessibleObject)control.Columns[0].HeaderCell.AccessibilityObject;

        Assert.NotEqual(Rectangle.Empty, accessibleObject.Bounds);
        Assert.True(control.IsHandleCreated);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_Bounds_IsEmptyRectangle_IfHandleIsNotCreated()
    {
        using DataGridView control = new();
        control.Columns.Add("Column 1", "Header text 1");

        var accessibleObject = (DataGridViewColumnHeaderCellAccessibleObject)control.Columns[0].HeaderCell.AccessibilityObject;

        Assert.Equal(Rectangle.Empty, accessibleObject.Bounds);
        Assert.False(control.IsHandleCreated);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_DefaultAction_ReturnsExpected_IfSortModeIsAutomatic()
    {
        using DataGridView control = new();
        control.Columns.Add("Column 1", "Header text 1");
        DataGridViewColumn column = control.Columns[0];
        column.SortMode = DataGridViewColumnSortMode.Automatic;

        var accessibleObject = (DataGridViewColumnHeaderCellAccessibleObject)column.HeaderCell.AccessibilityObject;

        Assert.Equal(SR.DataGridView_AccColumnHeaderCellDefaultAction, accessibleObject.DefaultAction);
        Assert.False(control.IsHandleCreated);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_GetPropertyValue_LegacyIAccessibleDefaultActionPropertyId_ReturnsExpected()
    {
        using DataGridView control = new();
        control.Columns.Add("Column 1", "Header text 1");
        DataGridViewColumn column = control.Columns[0];
        column.SortMode = DataGridViewColumnSortMode.Automatic;
        var accessibleObject = (DataGridViewColumnHeaderCellAccessibleObject)column.HeaderCell.AccessibilityObject;

        Assert.Equal(SR.DataGridView_AccColumnHeaderCellDefaultAction, ((BSTR)accessibleObject.GetPropertyValue(UIA_PROPERTY_ID.UIA_LegacyIAccessibleDefaultActionPropertyId)).ToStringAndFree());
        Assert.False(control.IsHandleCreated);
    }

    [WinFormsTheory]
    [InlineData((int)UIA_PATTERN_ID.UIA_InvokePatternId)]
    [InlineData((int)UIA_PATTERN_ID.UIA_LegacyIAccessiblePatternId)]
    public void DataGridViewColumnHeaderCellAccessibleObject_IsPatternSupported_ReturnsExpected(int patternId)
    {
        DataGridViewColumnHeaderCellAccessibleObject accessibleObject = new(null);

        Assert.True(accessibleObject.IsPatternSupported((UIA_PATTERN_ID)patternId));
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_ControlType_ReturnsExpected()
    {
        DataGridViewColumnHeaderCellAccessibleObject accessibleObject = new(null);

        Assert.Equal(UIA_CONTROLTYPE_ID.UIA_HeaderControlTypeId, (UIA_CONTROLTYPE_ID)(int)accessibleObject.GetPropertyValue(UIA_PROPERTY_ID.UIA_ControlTypePropertyId));
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_ValueValuepropertyId_ReturnsExpected()
    {
        using DataGridView control = new();
        control.Columns.Add("Column 1", "Header text 1");
        DataGridViewColumn column = control.Columns[0];
        column.SortMode = DataGridViewColumnSortMode.Automatic;

        var accessibleObject = (DataGridViewColumnHeaderCellAccessibleObject)column.HeaderCell.AccessibilityObject;
        Assert.Equal("Header text 1", ((BSTR)accessibleObject.GetPropertyValue(UIA_PROPERTY_ID.UIA_ValueValuePropertyId)).ToStringAndFree());
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_FragmentNavigate_Parent_ReturnsExpected()
    {
        using DataGridView control = new();
        control.Columns.Add("Column 1", "Header text 1");
        var accessibleObject = control.Columns[0].HeaderCell.AccessibilityObject;
        AccessibleObject topRowAccessibleObject = control.AccessibilityObject.TestAccessor().Dynamic.TopRowAccessibilityObject;

        Assert.Equal(topRowAccessibleObject, accessibleObject.FragmentNavigate(NavigateDirection.NavigateDirection_Parent));
        Assert.False(control.IsHandleCreated);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_FragmentNavigate_Sibling_ReturnsExpected_IfRowHeadersHidden()
    {
        using DataGridView control = new() { RowHeadersVisible = false };
        control.Columns.Add("Column 1", "Column 1");
        control.Columns.Add("Column 2", "Column 2");
        control.Columns.Add("Column 3", "Column 3");

        AccessibleObject accessibleObject1 = control.Columns[0].HeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject2 = control.Columns[1].HeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject3 = control.Columns[2].HeaderCell.AccessibilityObject;

        Assert.Equal(accessibleObject2, accessibleObject1.FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling));
        Assert.Equal(accessibleObject3, accessibleObject2.FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling));
        Assert.Null(accessibleObject3.FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling));

        Assert.Equal(accessibleObject2, accessibleObject3.FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling));
        Assert.Equal(accessibleObject1, accessibleObject2.FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling));
        Assert.Null(accessibleObject1.FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling));
        Assert.False(control.IsHandleCreated);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_FragmentNavigate_Sibling_ReturnsExpected_IfFirstColumnAndRowHeadersHidden()
    {
        using DataGridView control = new() { RowHeadersVisible = false };
        control.Columns.Add("Column 1", "Column 1");
        control.Columns.Add("Column 2", "Column 2");
        control.Columns.Add("Column 3", "Column 3");
        control.Columns[0].Visible = false;

        AccessibleObject accessibleObject2 = control.Columns[1].HeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject3 = control.Columns[2].HeaderCell.AccessibilityObject;

        Assert.Equal(accessibleObject3, accessibleObject2.FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling));
        Assert.Null(accessibleObject3.FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling));

        Assert.Equal(accessibleObject2, accessibleObject3.FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling));
        Assert.Null(accessibleObject2.FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling));
        Assert.False(control.IsHandleCreated);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_FragmentNavigate_Sibling_ReturnsExpected_IfSecondColumnAndRowHeadersHidden()
    {
        using DataGridView control = new() { RowHeadersVisible = false };
        control.Columns.Add("Column 1", "Column 1");
        control.Columns.Add("Column 2", "Column 2");
        control.Columns.Add("Column 3", "Column 3");
        control.Columns[1].Visible = false;

        AccessibleObject accessibleObject1 = control.Columns[0].HeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject3 = control.Columns[2].HeaderCell.AccessibilityObject;

        Assert.Equal(accessibleObject3, accessibleObject1.FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling));
        Assert.Null(accessibleObject3.FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling));

        Assert.Equal(accessibleObject1, accessibleObject3.FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling));
        Assert.Null(accessibleObject1.FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling));
        Assert.False(control.IsHandleCreated);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_FragmentNavigate_Sibling_ReturnsExpected_IfLastColumnAndRowHeadersHidden()
    {
        using DataGridView control = new() { RowHeadersVisible = false };
        control.Columns.Add("Column 1", "Column 1");
        control.Columns.Add("Column 2", "Column 2");
        control.Columns.Add("Column 3", "Column 3");
        control.Columns[2].Visible = false;

        AccessibleObject accessibleObject1 = control.Columns[0].HeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject2 = control.Columns[1].HeaderCell.AccessibilityObject;

        Assert.Equal(accessibleObject2, accessibleObject1.FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling));
        Assert.Null(accessibleObject2.FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling));

        Assert.Equal(accessibleObject1, accessibleObject2.FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling));
        Assert.Null(accessibleObject1.FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling));
        Assert.False(control.IsHandleCreated);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_FragmentNavigate_Sibling_ReturnsExpected()
    {
        using DataGridView control = new();
        control.Columns.Add("Column 1", "Column 1");
        control.Columns.Add("Column 2", "Column 2");
        control.Columns.Add("Column 3", "Column 3");

        AccessibleObject accessibleObject0 = control.TopLeftHeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject1 = control.Columns[0].HeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject2 = control.Columns[1].HeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject3 = control.Columns[2].HeaderCell.AccessibilityObject;

        Assert.Equal(accessibleObject1, accessibleObject0.FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling));
        Assert.Equal(accessibleObject2, accessibleObject1.FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling));
        Assert.Equal(accessibleObject3, accessibleObject2.FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling));
        Assert.Null(accessibleObject3.FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling));

        Assert.Equal(accessibleObject2, accessibleObject3.FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling));
        Assert.Equal(accessibleObject1, accessibleObject2.FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling));
        Assert.Equal(accessibleObject0, accessibleObject1.FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling));
        Assert.Null(accessibleObject0.FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling));
        Assert.False(control.IsHandleCreated);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_FragmentNavigate_Sibling_ReturnsExpected_IfFirstColumnHidden()
    {
        using DataGridView control = new();
        control.Columns.Add("Column 1", "Column 1");
        control.Columns.Add("Column 2", "Column 2");
        control.Columns.Add("Column 3", "Column 3");
        control.Columns[0].Visible = false;

        AccessibleObject accessibleObject0 = control.TopLeftHeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject2 = control.Columns[1].HeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject3 = control.Columns[2].HeaderCell.AccessibilityObject;

        Assert.Equal(accessibleObject2, accessibleObject0.FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling));
        Assert.Equal(accessibleObject3, accessibleObject2.FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling));
        Assert.Null(accessibleObject3.FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling));

        Assert.Equal(accessibleObject2, accessibleObject3.FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling));
        Assert.Equal(accessibleObject0, accessibleObject2.FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling));
        Assert.Null(accessibleObject0.FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling));
        Assert.False(control.IsHandleCreated);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_FragmentNavigate_Sibling_ReturnsExpected_IfSecondColumnHidden()
    {
        using DataGridView control = new();
        control.Columns.Add("Column 1", "Column 1");
        control.Columns.Add("Column 2", "Column 2");
        control.Columns.Add("Column 3", "Column 3");
        control.Columns[1].Visible = false;

        AccessibleObject accessibleObject0 = control.TopLeftHeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject1 = control.Columns[0].HeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject3 = control.Columns[2].HeaderCell.AccessibilityObject;

        Assert.Equal(accessibleObject1, accessibleObject0.FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling));
        Assert.Equal(accessibleObject3, accessibleObject1.FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling));
        Assert.Null(accessibleObject3.FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling));

        Assert.Equal(accessibleObject1, accessibleObject3.FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling));
        Assert.Equal(accessibleObject0, accessibleObject1.FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling));
        Assert.Null(accessibleObject0.FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling));
        Assert.False(control.IsHandleCreated);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_FragmentNavigate_Sibling_ReturnsExpected_IfLastColumnHidden()
    {
        using DataGridView control = new();
        control.Columns.Add("Column 1", "Column 1");
        control.Columns.Add("Column 2", "Column 2");
        control.Columns.Add("Column 3", "Column 3");
        control.Columns[2].Visible = false;

        AccessibleObject accessibleObject0 = control.TopLeftHeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject1 = control.Columns[0].HeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject2 = control.Columns[1].HeaderCell.AccessibilityObject;

        Assert.Equal(accessibleObject1, accessibleObject0.FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling));
        Assert.Equal(accessibleObject2, accessibleObject1.FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling));
        Assert.Null(accessibleObject2.FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling));

        Assert.Equal(accessibleObject1, accessibleObject2.FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling));
        Assert.Equal(accessibleObject0, accessibleObject1.FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling));
        Assert.Null(accessibleObject0.FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling));
        Assert.False(control.IsHandleCreated);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_Navigate_Sibling_ReturnsExpected_IfRowHeadersHidden()
    {
        using DataGridView control = new() { RowHeadersVisible = false };
        control.Columns.Add("Column 1", "Column 1");
        control.Columns.Add("Column 2", "Column 2");
        control.Columns.Add("Column 3", "Column 3");

        AccessibleObject accessibleObject1 = control.Columns[0].HeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject2 = control.Columns[1].HeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject3 = control.Columns[2].HeaderCell.AccessibilityObject;

        Assert.Equal(accessibleObject2, accessibleObject1.Navigate(AccessibleNavigation.Next));
        Assert.Equal(accessibleObject3, accessibleObject2.Navigate(AccessibleNavigation.Next));
        Assert.Null(accessibleObject3.Navigate(AccessibleNavigation.Next));

        Assert.Equal(accessibleObject2, accessibleObject3.Navigate(AccessibleNavigation.Previous));
        Assert.Equal(accessibleObject1, accessibleObject2.Navigate(AccessibleNavigation.Previous));
        Assert.Null(accessibleObject1.Navigate(AccessibleNavigation.Previous));
        Assert.False(control.IsHandleCreated);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_Navigate_Sibling_ReturnsExpected_IfFirstColumnAndRowHeadersHidden()
    {
        using DataGridView control = new() { RowHeadersVisible = false };
        control.Columns.Add("Column 1", "Column 1");
        control.Columns.Add("Column 2", "Column 2");
        control.Columns.Add("Column 3", "Column 3");
        control.Columns[0].Visible = false;

        AccessibleObject accessibleObject2 = control.Columns[1].HeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject3 = control.Columns[2].HeaderCell.AccessibilityObject;

        Assert.Equal(accessibleObject3, accessibleObject2.Navigate(AccessibleNavigation.Next));
        Assert.Null(accessibleObject3.Navigate(AccessibleNavigation.Next));

        Assert.Equal(accessibleObject2, accessibleObject3.Navigate(AccessibleNavigation.Previous));
        Assert.Null(accessibleObject2.Navigate(AccessibleNavigation.Previous));
        Assert.False(control.IsHandleCreated);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_Navigate_Sibling_ReturnsExpected_IfSecondColumnAndRowHeadersHidden()
    {
        using DataGridView control = new() { RowHeadersVisible = false };
        control.Columns.Add("Column 1", "Column 1");
        control.Columns.Add("Column 2", "Column 2");
        control.Columns.Add("Column 3", "Column 3");
        control.Columns[1].Visible = false;

        AccessibleObject accessibleObject1 = control.Columns[0].HeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject3 = control.Columns[2].HeaderCell.AccessibilityObject;

        Assert.Equal(accessibleObject3, accessibleObject1.Navigate(AccessibleNavigation.Next));
        Assert.Null(accessibleObject3.Navigate(AccessibleNavigation.Next));

        Assert.Equal(accessibleObject1, accessibleObject3.Navigate(AccessibleNavigation.Previous));
        Assert.Null(accessibleObject1.Navigate(AccessibleNavigation.Previous));
        Assert.False(control.IsHandleCreated);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_Navigate_Sibling_ReturnsExpected_IfLastColumnAndRowHeadersHidden()
    {
        using DataGridView control = new() { RowHeadersVisible = false };
        control.Columns.Add("Column 1", "Column 1");
        control.Columns.Add("Column 2", "Column 2");
        control.Columns.Add("Column 3", "Column 3");
        control.Columns[2].Visible = false;

        AccessibleObject accessibleObject1 = control.Columns[0].HeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject2 = control.Columns[1].HeaderCell.AccessibilityObject;

        Assert.Equal(accessibleObject2, accessibleObject1.Navigate(AccessibleNavigation.Next));
        Assert.Null(accessibleObject2.Navigate(AccessibleNavigation.Next));

        Assert.Equal(accessibleObject1, accessibleObject2.Navigate(AccessibleNavigation.Previous));
        Assert.Null(accessibleObject1.Navigate(AccessibleNavigation.Previous));
        Assert.False(control.IsHandleCreated);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_Navigate_Sibling_ReturnsExpected()
    {
        using DataGridView control = new();
        control.Columns.Add("Column 1", "Column 1");
        control.Columns.Add("Column 2", "Column 2");
        control.Columns.Add("Column 3", "Column 3");

        AccessibleObject accessibleObject0 = control.TopLeftHeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject1 = control.Columns[0].HeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject2 = control.Columns[1].HeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject3 = control.Columns[2].HeaderCell.AccessibilityObject;

        Assert.Equal(accessibleObject1, accessibleObject0.Navigate(AccessibleNavigation.Next));
        Assert.Equal(accessibleObject2, accessibleObject1.Navigate(AccessibleNavigation.Next));
        Assert.Equal(accessibleObject3, accessibleObject2.Navigate(AccessibleNavigation.Next));
        Assert.Null(accessibleObject3.Navigate(AccessibleNavigation.Next));

        Assert.Equal(accessibleObject2, accessibleObject3.Navigate(AccessibleNavigation.Previous));
        Assert.Equal(accessibleObject1, accessibleObject2.Navigate(AccessibleNavigation.Previous));
        Assert.Equal(accessibleObject0, accessibleObject1.Navigate(AccessibleNavigation.Previous));
        Assert.Null(accessibleObject0.Navigate(AccessibleNavigation.Previous));
        Assert.False(control.IsHandleCreated);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_Navigate_Sibling_ReturnsExpected_IfFirstColumnHidden()
    {
        using DataGridView control = new();
        control.Columns.Add("Column 1", "Column 1");
        control.Columns.Add("Column 2", "Column 2");
        control.Columns.Add("Column 3", "Column 3");
        control.Columns[0].Visible = false;

        AccessibleObject accessibleObject0 = control.TopLeftHeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject2 = control.Columns[1].HeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject3 = control.Columns[2].HeaderCell.AccessibilityObject;

        Assert.Equal(accessibleObject2, accessibleObject0.Navigate(AccessibleNavigation.Next));
        Assert.Equal(accessibleObject3, accessibleObject2.Navigate(AccessibleNavigation.Next));
        Assert.Null(accessibleObject3.Navigate(AccessibleNavigation.Next));

        Assert.Equal(accessibleObject2, accessibleObject3.Navigate(AccessibleNavigation.Previous));
        Assert.Equal(accessibleObject0, accessibleObject2.Navigate(AccessibleNavigation.Previous));
        Assert.Null(accessibleObject0.Navigate(AccessibleNavigation.Previous));
        Assert.False(control.IsHandleCreated);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_Navigate_Sibling_ReturnsExpected_IfSecondColumnHidden()
    {
        using DataGridView control = new();
        control.Columns.Add("Column 1", "Column 1");
        control.Columns.Add("Column 2", "Column 2");
        control.Columns.Add("Column 3", "Column 3");
        control.Columns[1].Visible = false;

        AccessibleObject accessibleObject0 = control.TopLeftHeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject1 = control.Columns[0].HeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject3 = control.Columns[2].HeaderCell.AccessibilityObject;

        Assert.Equal(accessibleObject1, accessibleObject0.Navigate(AccessibleNavigation.Next));
        Assert.Equal(accessibleObject3, accessibleObject1.Navigate(AccessibleNavigation.Next));
        Assert.Null(accessibleObject3.Navigate(AccessibleNavigation.Next));

        Assert.Equal(accessibleObject1, accessibleObject3.Navigate(AccessibleNavigation.Previous));
        Assert.Equal(accessibleObject0, accessibleObject1.Navigate(AccessibleNavigation.Previous));
        Assert.Null(accessibleObject0.Navigate(AccessibleNavigation.Previous));
        Assert.False(control.IsHandleCreated);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_Navigate_Sibling_ReturnsExpected_IfLastColumnHidden()
    {
        using DataGridView control = new();
        control.Columns.Add("Column 1", "Column 1");
        control.Columns.Add("Column 2", "Column 2");
        control.Columns.Add("Column 3", "Column 3");
        control.Columns[2].Visible = false;

        AccessibleObject accessibleObject0 = control.TopLeftHeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject1 = control.Columns[0].HeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject2 = control.Columns[1].HeaderCell.AccessibilityObject;

        Assert.Equal(accessibleObject1, accessibleObject0.Navigate(AccessibleNavigation.Next));
        Assert.Equal(accessibleObject2, accessibleObject1.Navigate(AccessibleNavigation.Next));
        Assert.Null(accessibleObject2.Navigate(AccessibleNavigation.Next));

        Assert.Equal(accessibleObject1, accessibleObject2.Navigate(AccessibleNavigation.Previous));
        Assert.Equal(accessibleObject0, accessibleObject1.Navigate(AccessibleNavigation.Previous));
        Assert.Null(accessibleObject0.Navigate(AccessibleNavigation.Previous));
        Assert.False(control.IsHandleCreated);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_Navigate_Child_ReturnsNull_IfRowHeadersHidden()
    {
        using DataGridView control = new() { RowHeadersVisible = false };
        control.Columns.Add("Column 1", "Column 1");
        AccessibleObject accessibleObject = control.Columns[0].HeaderCell.AccessibilityObject;

        Assert.Null(accessibleObject.Navigate(AccessibleNavigation.FirstChild));
        Assert.Null(accessibleObject.Navigate(AccessibleNavigation.LastChild));
        Assert.False(control.IsHandleCreated);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_Navigate_Child_ReturnsNull()
    {
        using DataGridView control = new();
        control.Columns.Add("Column 1", "Column 1");
        AccessibleObject accessibleObject0 = control.TopLeftHeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject1 = control.Columns[0].HeaderCell.AccessibilityObject;

        Assert.Null(accessibleObject0.Navigate(AccessibleNavigation.FirstChild));
        Assert.Null(accessibleObject0.Navigate(AccessibleNavigation.LastChild));
        Assert.Null(accessibleObject1.Navigate(AccessibleNavigation.FirstChild));
        Assert.Null(accessibleObject1.Navigate(AccessibleNavigation.LastChild));
        Assert.False(control.IsHandleCreated);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_FragmentNavigate_Child_ReturnsNull_IfRowHeadersHidden()
    {
        using DataGridView control = new() { RowHeadersVisible = false };
        control.Columns.Add("Column 1", "Column 1");
        AccessibleObject accessibleObject = control.Columns[0].HeaderCell.AccessibilityObject;

        Assert.Null(accessibleObject.FragmentNavigate(NavigateDirection.NavigateDirection_FirstChild));
        Assert.Null(accessibleObject.FragmentNavigate(NavigateDirection.NavigateDirection_LastChild));
        Assert.False(control.IsHandleCreated);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_FragmentNavigate_Child_ReturnsNull()
    {
        using DataGridView control = new();
        control.Columns.Add("Column 1", "Column 1");
        AccessibleObject accessibleObject0 = control.TopLeftHeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject1 = control.Columns[0].HeaderCell.AccessibilityObject;

        Assert.Null(accessibleObject0.FragmentNavigate(NavigateDirection.NavigateDirection_FirstChild));
        Assert.Null(accessibleObject0.FragmentNavigate(NavigateDirection.NavigateDirection_LastChild));
        Assert.Null(accessibleObject1.FragmentNavigate(NavigateDirection.NavigateDirection_FirstChild));
        Assert.Null(accessibleObject1.FragmentNavigate(NavigateDirection.NavigateDirection_LastChild));
        Assert.False(control.IsHandleCreated);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_FragmentNavigate_Sibling_ReturnsExpected_IfCustomOrder()
    {
        using DataGridView control = new();
        control.Columns.Add("Column 1", "Column 1");
        control.Columns.Add("Column 2", "Column 2");
        control.Columns.Add("Column 3", "Column 3");
        control.Columns[0].DisplayIndex = 2;
        control.Columns[1].DisplayIndex = 1;
        control.Columns[2].DisplayIndex = 0;

        AccessibleObject accessibleObject0 = control.TopLeftHeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject1 = control.Columns[2].HeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject2 = control.Columns[1].HeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject3 = control.Columns[0].HeaderCell.AccessibilityObject;

        Assert.Equal(accessibleObject1, accessibleObject0.FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling));
        Assert.Equal(accessibleObject2, accessibleObject1.FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling));
        Assert.Equal(accessibleObject3, accessibleObject2.FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling));
        Assert.Null(accessibleObject3.FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling));

        Assert.Equal(accessibleObject2, accessibleObject3.FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling));
        Assert.Equal(accessibleObject1, accessibleObject2.FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling));
        Assert.Equal(accessibleObject0, accessibleObject1.FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling));
        Assert.Null(accessibleObject0.FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling));
        Assert.False(control.IsHandleCreated);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_FragmentNavigate_Sibling_ReturnsExpected_IfCustomOrderAndFirstColumnHidden()
    {
        using DataGridView control = new();
        control.Columns.Add("Column 1", "Column 1");
        control.Columns.Add("Column 2", "Column 2");
        control.Columns.Add("Column 3", "Column 3");
        control.Columns[0].DisplayIndex = 2;
        control.Columns[0].Visible = false;
        control.Columns[1].DisplayIndex = 1;
        control.Columns[2].DisplayIndex = 0;

        AccessibleObject accessibleObject0 = control.TopLeftHeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject1 = control.Columns[2].HeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject2 = control.Columns[1].HeaderCell.AccessibilityObject;

        Assert.Equal(accessibleObject1, accessibleObject0.FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling));
        Assert.Equal(accessibleObject2, accessibleObject1.FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling));
        Assert.Null(accessibleObject2.FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling));

        Assert.Equal(accessibleObject1, accessibleObject2.FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling));
        Assert.Equal(accessibleObject0, accessibleObject1.FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling));
        Assert.Null(accessibleObject0.FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling));
        Assert.False(control.IsHandleCreated);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_FragmentNavigate_Sibling_ReturnsExpected_IfCustomOrderAndSecondColumnHidden()
    {
        using DataGridView control = new();
        control.Columns.Add("Column 1", "Column 1");
        control.Columns.Add("Column 2", "Column 2");
        control.Columns.Add("Column 3", "Column 3");
        control.Columns[0].DisplayIndex = 2;
        control.Columns[1].DisplayIndex = 1;
        control.Columns[1].Visible = false;
        control.Columns[2].DisplayIndex = 0;

        AccessibleObject accessibleObject0 = control.TopLeftHeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject1 = control.Columns[2].HeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject3 = control.Columns[0].HeaderCell.AccessibilityObject;

        Assert.Equal(accessibleObject1, accessibleObject0.FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling));
        Assert.Equal(accessibleObject3, accessibleObject1.FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling));
        Assert.Null(accessibleObject3.FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling));

        Assert.Equal(accessibleObject1, accessibleObject3.FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling));
        Assert.Equal(accessibleObject0, accessibleObject1.FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling));
        Assert.Null(accessibleObject0.FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling));
        Assert.False(control.IsHandleCreated);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_FragmentNavigate_Sibling_ReturnsExpected_IfCustomOrderAndLastColumnHidden()
    {
        using DataGridView control = new();
        control.Columns.Add("Column 1", "Column 1");
        control.Columns.Add("Column 2", "Column 2");
        control.Columns.Add("Column 3", "Column 3");
        control.Columns[0].DisplayIndex = 2;
        control.Columns[1].DisplayIndex = 1;
        control.Columns[2].DisplayIndex = 0;
        control.Columns[2].Visible = false;

        AccessibleObject accessibleObject0 = control.TopLeftHeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject2 = control.Columns[1].HeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject3 = control.Columns[0].HeaderCell.AccessibilityObject;

        Assert.Equal(accessibleObject2, accessibleObject0.FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling));
        Assert.Equal(accessibleObject3, accessibleObject2.FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling));
        Assert.Null(accessibleObject3.FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling));

        Assert.Equal(accessibleObject2, accessibleObject3.FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling));
        Assert.Equal(accessibleObject0, accessibleObject2.FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling));
        Assert.Null(accessibleObject0.FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling));
        Assert.False(control.IsHandleCreated);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_FragmentNavigate_Sibling_ReturnsExpected_IfCustomOrderAndRowHeadersHidden()
    {
        using DataGridView control = new() { RowHeadersVisible = false };
        control.Columns.Add("Column 1", "Column 1");
        control.Columns.Add("Column 2", "Column 2");
        control.Columns.Add("Column 3", "Column 3");
        control.Columns[0].DisplayIndex = 2;
        control.Columns[1].DisplayIndex = 1;
        control.Columns[2].DisplayIndex = 0;

        AccessibleObject accessibleObject1 = control.Columns[2].HeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject2 = control.Columns[1].HeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject3 = control.Columns[0].HeaderCell.AccessibilityObject;

        Assert.Equal(accessibleObject2, accessibleObject1.FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling));
        Assert.Equal(accessibleObject3, accessibleObject2.FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling));
        Assert.Null(accessibleObject3.FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling));

        Assert.Equal(accessibleObject2, accessibleObject3.FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling));
        Assert.Equal(accessibleObject1, accessibleObject2.FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling));
        Assert.Null(accessibleObject1.FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling));
        Assert.False(control.IsHandleCreated);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_FragmentNavigate_Sibling_ReturnsExpected_IfCustomOrderAndFirstColumnAndRowHeadersHidden()
    {
        using DataGridView control = new() { RowHeadersVisible = false };
        control.Columns.Add("Column 1", "Column 1");
        control.Columns.Add("Column 2", "Column 2");
        control.Columns.Add("Column 3", "Column 3");
        control.Columns[0].DisplayIndex = 2;
        control.Columns[0].Visible = false;
        control.Columns[1].DisplayIndex = 1;
        control.Columns[2].DisplayIndex = 0;

        AccessibleObject accessibleObject1 = control.Columns[2].HeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject2 = control.Columns[1].HeaderCell.AccessibilityObject;

        Assert.Equal(accessibleObject2, accessibleObject1.FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling));
        Assert.Null(accessibleObject2.FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling));

        Assert.Equal(accessibleObject1, accessibleObject2.FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling));
        Assert.Null(accessibleObject1.FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling));
        Assert.False(control.IsHandleCreated);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_FragmentNavigate_Sibling_ReturnsExpected_IfCustomOrderAndSecondColumnAndRowHeadersHidden()
    {
        using DataGridView control = new() { RowHeadersVisible = false };
        control.Columns.Add("Column 1", "Column 1");
        control.Columns.Add("Column 2", "Column 2");
        control.Columns.Add("Column 3", "Column 3");
        control.Columns[0].DisplayIndex = 2;
        control.Columns[1].DisplayIndex = 1;
        control.Columns[1].Visible = false;
        control.Columns[2].DisplayIndex = 0;

        AccessibleObject accessibleObject1 = control.Columns[2].HeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject3 = control.Columns[0].HeaderCell.AccessibilityObject;

        Assert.Equal(accessibleObject3, accessibleObject1.FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling));
        Assert.Null(accessibleObject3.FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling));

        Assert.Equal(accessibleObject1, accessibleObject3.FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling));
        Assert.Null(accessibleObject1.FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling));
        Assert.False(control.IsHandleCreated);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_FragmentNavigate_Sibling_ReturnsExpected_IfCustomOrderAndLastColumnAndRowHeadersHidden()
    {
        using DataGridView control = new() { RowHeadersVisible = false };
        control.Columns.Add("Column 1", "Column 1");
        control.Columns.Add("Column 2", "Column 2");
        control.Columns.Add("Column 3", "Column 3");
        control.Columns[0].DisplayIndex = 2;
        control.Columns[1].DisplayIndex = 1;
        control.Columns[2].DisplayIndex = 0;
        control.Columns[2].Visible = false;

        AccessibleObject accessibleObject2 = control.Columns[1].HeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject3 = control.Columns[0].HeaderCell.AccessibilityObject;

        Assert.Equal(accessibleObject3, accessibleObject2.FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling));
        Assert.Null(accessibleObject3.FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling));

        Assert.Equal(accessibleObject2, accessibleObject3.FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling));
        Assert.Null(accessibleObject2.FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling));
        Assert.False(control.IsHandleCreated);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_Navigate_Sibling_ReturnsExpected_IfCustomOrder()
    {
        using DataGridView control = new();
        control.Columns.Add("Column 1", "Column 1");
        control.Columns.Add("Column 2", "Column 2");
        control.Columns.Add("Column 3", "Column 3");
        control.Columns[0].DisplayIndex = 2;
        control.Columns[1].DisplayIndex = 1;
        control.Columns[2].DisplayIndex = 0;

        AccessibleObject accessibleObject0 = control.TopLeftHeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject1 = control.Columns[2].HeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject2 = control.Columns[1].HeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject3 = control.Columns[0].HeaderCell.AccessibilityObject;

        Assert.Equal(accessibleObject1, accessibleObject0.Navigate(AccessibleNavigation.Next));
        Assert.Equal(accessibleObject2, accessibleObject1.Navigate(AccessibleNavigation.Next));
        Assert.Equal(accessibleObject3, accessibleObject2.Navigate(AccessibleNavigation.Next));
        Assert.Null(accessibleObject3.Navigate(AccessibleNavigation.Next));

        Assert.Equal(accessibleObject2, accessibleObject3.Navigate(AccessibleNavigation.Previous));
        Assert.Equal(accessibleObject1, accessibleObject2.Navigate(AccessibleNavigation.Previous));
        Assert.Equal(accessibleObject0, accessibleObject1.Navigate(AccessibleNavigation.Previous));
        Assert.Null(accessibleObject0.Navigate(AccessibleNavigation.Previous));
        Assert.False(control.IsHandleCreated);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_Navigate_Sibling_ReturnsExpected_IfCustomOrderAndFirstColumnHidden()
    {
        using DataGridView control = new();
        control.Columns.Add("Column 1", "Column 1");
        control.Columns.Add("Column 2", "Column 2");
        control.Columns.Add("Column 3", "Column 3");
        control.Columns[0].DisplayIndex = 2;
        control.Columns[0].Visible = false;
        control.Columns[1].DisplayIndex = 1;
        control.Columns[2].DisplayIndex = 0;

        AccessibleObject accessibleObject0 = control.TopLeftHeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject1 = control.Columns[2].HeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject2 = control.Columns[1].HeaderCell.AccessibilityObject;

        Assert.Equal(accessibleObject1, accessibleObject0.Navigate(AccessibleNavigation.Next));
        Assert.Equal(accessibleObject2, accessibleObject1.Navigate(AccessibleNavigation.Next));
        Assert.Null(accessibleObject2.Navigate(AccessibleNavigation.Next));

        Assert.Equal(accessibleObject1, accessibleObject2.Navigate(AccessibleNavigation.Previous));
        Assert.Equal(accessibleObject0, accessibleObject1.Navigate(AccessibleNavigation.Previous));
        Assert.Null(accessibleObject0.Navigate(AccessibleNavigation.Previous));
        Assert.False(control.IsHandleCreated);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_Navigate_Sibling_ReturnsExpected_IfCustomOrderAndSecondColumnHidden()
    {
        using DataGridView control = new();
        control.Columns.Add("Column 1", "Column 1");
        control.Columns.Add("Column 2", "Column 2");
        control.Columns.Add("Column 3", "Column 3");
        control.Columns[0].DisplayIndex = 2;
        control.Columns[1].DisplayIndex = 1;
        control.Columns[1].Visible = false;
        control.Columns[2].DisplayIndex = 0;

        AccessibleObject accessibleObject0 = control.TopLeftHeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject1 = control.Columns[2].HeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject3 = control.Columns[0].HeaderCell.AccessibilityObject;

        Assert.Equal(accessibleObject1, accessibleObject0.Navigate(AccessibleNavigation.Next));
        Assert.Equal(accessibleObject3, accessibleObject1.Navigate(AccessibleNavigation.Next));
        Assert.Null(accessibleObject3.Navigate(AccessibleNavigation.Next));

        Assert.Equal(accessibleObject1, accessibleObject3.Navigate(AccessibleNavigation.Previous));
        Assert.Equal(accessibleObject0, accessibleObject1.Navigate(AccessibleNavigation.Previous));
        Assert.Null(accessibleObject0.Navigate(AccessibleNavigation.Previous));
        Assert.False(control.IsHandleCreated);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_Navigate_Sibling_ReturnsExpected_IfCustomOrderAndLastColumnHidden()
    {
        using DataGridView control = new();
        control.Columns.Add("Column 1", "Column 1");
        control.Columns.Add("Column 2", "Column 2");
        control.Columns.Add("Column 3", "Column 3");
        control.Columns[0].DisplayIndex = 2;
        control.Columns[1].DisplayIndex = 1;
        control.Columns[2].DisplayIndex = 0;
        control.Columns[2].Visible = false;

        AccessibleObject accessibleObject0 = control.TopLeftHeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject2 = control.Columns[1].HeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject3 = control.Columns[0].HeaderCell.AccessibilityObject;

        Assert.Equal(accessibleObject2, accessibleObject0.Navigate(AccessibleNavigation.Next));
        Assert.Equal(accessibleObject3, accessibleObject2.Navigate(AccessibleNavigation.Next));
        Assert.Null(accessibleObject3.Navigate(AccessibleNavigation.Next));

        Assert.Equal(accessibleObject2, accessibleObject3.Navigate(AccessibleNavigation.Previous));
        Assert.Equal(accessibleObject0, accessibleObject2.Navigate(AccessibleNavigation.Previous));
        Assert.Null(accessibleObject0.Navigate(AccessibleNavigation.Previous));
        Assert.False(control.IsHandleCreated);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_Navigate_Sibling_ReturnsExpected_IfCustomOrderAndRowHeadersHidden()
    {
        using DataGridView control = new() { RowHeadersVisible = false };
        control.Columns.Add("Column 1", "Column 1");
        control.Columns.Add("Column 2", "Column 2");
        control.Columns.Add("Column 3", "Column 3");
        control.Columns[0].DisplayIndex = 2;
        control.Columns[1].DisplayIndex = 1;
        control.Columns[2].DisplayIndex = 0;

        AccessibleObject accessibleObject1 = control.Columns[2].HeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject2 = control.Columns[1].HeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject3 = control.Columns[0].HeaderCell.AccessibilityObject;

        Assert.Equal(accessibleObject2, accessibleObject1.Navigate(AccessibleNavigation.Next));
        Assert.Equal(accessibleObject3, accessibleObject2.Navigate(AccessibleNavigation.Next));
        Assert.Null(accessibleObject3.Navigate(AccessibleNavigation.Next));

        Assert.Equal(accessibleObject2, accessibleObject3.Navigate(AccessibleNavigation.Previous));
        Assert.Equal(accessibleObject1, accessibleObject2.Navigate(AccessibleNavigation.Previous));
        Assert.Null(accessibleObject1.Navigate(AccessibleNavigation.Previous));
        Assert.False(control.IsHandleCreated);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_Navigate_Sibling_ReturnsExpected_IfCustomOrderAndFirstColumnAndRowHeadersHidden()
    {
        using DataGridView control = new() { RowHeadersVisible = false };
        control.Columns.Add("Column 1", "Column 1");
        control.Columns.Add("Column 2", "Column 2");
        control.Columns.Add("Column 3", "Column 3");
        control.Columns[0].DisplayIndex = 2;
        control.Columns[0].Visible = false;
        control.Columns[1].DisplayIndex = 1;
        control.Columns[2].DisplayIndex = 0;

        AccessibleObject accessibleObject1 = control.Columns[2].HeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject2 = control.Columns[1].HeaderCell.AccessibilityObject;

        Assert.Equal(accessibleObject2, accessibleObject1.Navigate(AccessibleNavigation.Next));
        Assert.Null(accessibleObject2.Navigate(AccessibleNavigation.Next));

        Assert.Equal(accessibleObject1, accessibleObject2.Navigate(AccessibleNavigation.Previous));
        Assert.Null(accessibleObject1.Navigate(AccessibleNavigation.Previous));
        Assert.False(control.IsHandleCreated);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_Navigate_Sibling_ReturnsExpected_IfCustomOrderAndSecondColumnAndRowHeadersHidden()
    {
        using DataGridView control = new() { RowHeadersVisible = false };
        control.Columns.Add("Column 1", "Column 1");
        control.Columns.Add("Column 2", "Column 2");
        control.Columns.Add("Column 3", "Column 3");
        control.Columns[0].DisplayIndex = 2;
        control.Columns[1].DisplayIndex = 1;
        control.Columns[1].Visible = false;
        control.Columns[2].DisplayIndex = 0;

        AccessibleObject accessibleObject1 = control.Columns[2].HeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject3 = control.Columns[0].HeaderCell.AccessibilityObject;

        Assert.Equal(accessibleObject3, accessibleObject1.Navigate(AccessibleNavigation.Next));
        Assert.Null(accessibleObject3.Navigate(AccessibleNavigation.Next));

        Assert.Equal(accessibleObject1, accessibleObject3.Navigate(AccessibleNavigation.Previous));
        Assert.Null(accessibleObject1.Navigate(AccessibleNavigation.Previous));
        Assert.False(control.IsHandleCreated);
    }

    [WinFormsFact]
    public void DataGridViewColumnHeaderCellAccessibleObject_Navigate_Sibling_ReturnsExpected_IfCustomOrderAndLastColumnAndRowHeadersHidden()
    {
        using DataGridView control = new() { RowHeadersVisible = false };
        control.Columns.Add("Column 1", "Column 1");
        control.Columns.Add("Column 2", "Column 2");
        control.Columns.Add("Column 3", "Column 3");
        control.Columns[0].DisplayIndex = 2;
        control.Columns[1].DisplayIndex = 1;
        control.Columns[2].DisplayIndex = 0;
        control.Columns[2].Visible = false;

        AccessibleObject accessibleObject2 = control.Columns[1].HeaderCell.AccessibilityObject;
        AccessibleObject accessibleObject3 = control.Columns[0].HeaderCell.AccessibilityObject;

        Assert.Equal(accessibleObject3, accessibleObject2.Navigate(AccessibleNavigation.Next));
        Assert.Null(accessibleObject3.Navigate(AccessibleNavigation.Next));

        Assert.Equal(accessibleObject2, accessibleObject3.Navigate(AccessibleNavigation.Previous));
        Assert.Null(accessibleObject2.Navigate(AccessibleNavigation.Previous));
        Assert.False(control.IsHandleCreated);
    }
}
